package com.herench.bs.transfer;

import org.apache.cxf.endpoint.Client;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 提取创建患者数据
 *
 * @author liuxiaohui
 * @date 2019/3/26
 */
public class EstablishPatientTransfer extends AbstractTransfer {
    public EstablishPatientTransfer(String method, Client client, String messageMethod) {
        super(method, client, messageMethod);
    }

    /**
     * 发送：微信前端JSON数据转换为HIS用的XML数据（微信前端==》HIS）
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public String toInvokeMessage(Map<String, Object> params) throws Exception {
        // 身份证号
        String idNo = (String) params.get("idNo");
        // 姓名
        String name = (String) params.get("name");
        // 年龄
        String age = (String) params.get("age");
        // 生日
        String birthday = (String) params.get("birthday");
        // 性别，中文（男、女、未知）
        String sex = (String) params.get("sex");
        // 手机号码
        String phoneNumberHome = (String) params.get("phoneNumberHome");
        // 费别，中文
        String chargeType = (String) params.get("chargeType");

        // 住址
        String address = (String) params.get("address");
        // 民族，中文（汉族，回族等）
        String nation = (String) params.get("nation");
        // 出生地，代码
        String birthPlace = (String) params.get("birthPlace");
        // 邮政编码
        String zipCode = (String) params.get("zipCode");
        // 身份，中文
        String identity = (String) params.get("identity");

        // 婚姻状况，代码
        String maritalStatus = (String) params.get("maritalStatus");
        // 医保卡号
        String insurNo = (String) params.get("insurNo");
        // 医保卡密码
        String insurPwd = (String) params.get("insurPwd");
        // 卡号
        String cardNo = (String) params.get("cardNo");
        // 卡类型
        String cardType = (String) params.get("cardType");
        // 个人编码
        String personNo = (String) params.get("personNo");
        // 是否匿名
        String isAnonymous = (String) params.get("isAnonymous");

        // 交易ID：his的方法名
        Document document = getTplDoc(getMethod());

        // 将各个入参数设值（入参==》XML）
        Element dataRowPatient  = document.getRootElement().element("CommitData").addElement("Patient").addElement("DataRow");
        Element dataRowInsurance = document.getRootElement().element("CommitData").addElement("Insurance").addElement("DataRow");
        Element dataRowCard = document.getRootElement().element("CommitData").addElement("Card").addElement("DataRow");
        // 身份证号
        dataRowPatient.addAttribute("ID_NO", idNo);
        // 姓名
        dataRowPatient.addAttribute("NAME", name);
        // 年龄
        dataRowPatient.addAttribute("AGE", age);
        // 生日
        dataRowPatient.addAttribute("BIRTHDAY", birthday);
        // 性别，中文（男、女、未知）
        dataRowPatient.addAttribute("SEX", sex);
        // 住址
        dataRowPatient.addAttribute("ADDRESS", address);
        // 民族，中文（汉族，回族等）
        dataRowPatient.addAttribute("NATION", nation);
        // 出生地，代码
        dataRowPatient.addAttribute("BIRTH_PLACE", birthPlace);
        // 邮政编码
        dataRowPatient.addAttribute("ZIP_CODE", zipCode);
        // 手机号码
        dataRowPatient.addAttribute("PHONE_NUMBER_HOME", phoneNumberHome);
        // 身份，中文
        dataRowPatient.addAttribute("IDENTITY", identity);
        // 费别，中文
        dataRowPatient.addAttribute("CHARGE_TYPE", chargeType);
        // 婚姻状况，代码
        dataRowPatient.addAttribute("MARITAL_STATUS", maritalStatus);

        // 医保卡号
        dataRowInsurance.addAttribute("INSUR_NO", insurNo);
        // 医保卡密码
        dataRowInsurance.addAttribute("INSUR_PWD", insurPwd);

        // 卡号
        dataRowCard.addAttribute("CARD_NO", cardNo);
        // 卡类型
        dataRowCard.addAttribute("CARD_TYPE", cardType);
        // 个人编码
        dataRowCard.addAttribute("PERSON_NO", personNo);
        // 是否匿名
        dataRowCard.addAttribute("IS_ANONYMOUS", isAnonymous);

        return document.asXML();
    }

    /**
     * 接收：HIS返回的XML数据并转换为JSON（HIS==》微信前端）
     * @param resMsg
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> toResultMessage(String resMsg) throws Exception {
        Map<String, Object> resMap = new HashMap<>(16);
        Document document = DocumentHelper.parseText(resMsg);

        Element resultInfo = document.getRootElement().element("Result").element("Info");
        String executeStatus = resultInfo.attributeValue("EXECUTE_STATUS");
        String executeMessage = resultInfo.attributeValue("EXECUTE_MESSAGE");

        if (Dialect.getSuccessfulState().equals(executeStatus)) {
            // 获取各个参数的值（出参的树状结构：父==》子）

            // 取得数据为数组形式
            Element dataRow = document.getRootElement().element("ReturnData").element("Data").element("DataRow");

            if (dataRow == null) {
                resMap.put("code", "1403");
                resMap.put("message", "调用成功，但是获取的数据为 0 件！");
            } else {
                EstablishPatientInnerMessage innerMessage = new EstablishPatientInnerMessage(dataRow);

                // 患者ID
                resMap.put("patientId", innerMessage.getPatientId());

                // 返回Code
                resMap.put("code", executeStatus);
                // 返回信息
                resMap.put("message", "成功！");
            }
        } else {
            resMap.put("code", executeStatus);
            resMap.put("message", executeMessage);
        }
        return resMap;
    }


    public class EstablishPatientInnerMessage implements InnerMessage{

        /**
         * 患者ID
         */
        private String patientId;



        public EstablishPatientInnerMessage(Element element) {
            // 患者ID
            this.patientId = element.attributeValue("PATIENT_ID");
        }

        /**
         * 患者ID
         */
        public String getPatientId() {
            return patientId;
        }

    }

}
